package com.back.controller;

import com.back.common.utils.Result;
import com.back.common.utils.SecurityUtil;
import com.back.dto.UpdatePasswordDTO;
import com.back.dto.UpdateUserInfoDTO;
import com.back.entity.User;
import com.back.service.IUserService;
import com.back.vo.UserVO;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.back.common.utils.MD5Util;
import com.back.common.utils.UserConverter;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;

/**
 * <p>
 * 用户相关接口
 * </p>
 *
 * @author liyang
 * @since 2025-04-26
 */
@RestController
@RequestMapping("/user")
@Api(tags = "用户接口")
@Slf4j
@Validated
public class UserController {
    
    @Autowired
    private IUserService userService;
    
    /**
     * 获取当前用户信息
     */
    @ApiOperation(value = "获取当前用户信息")
    @GetMapping("/info")
    public Result getCurrentUser() {
        // 获取当前用户ID
        Long userId = SecurityUtil.getCurrentUserId();
        // 查询用户信息
        User user = userService.getById(userId);
        if (user == null) {
            return Result.error().message("用户不存在");
        }
        
        UserVO userVO = UserConverter.convertToVO(user);
        return Result.ok().message("获取用户信息成功").data("user", userVO);
    }
    
    /**
     * 更新用户信息
     */
    @ApiOperation(value = "更新用户信息")
    @PutMapping("/info")
    public Result updateUserInfo(@Valid @RequestBody UpdateUserInfoDTO dto) {
        // 获取当前用户ID
        Long userId = SecurityUtil.getCurrentUserId();
        // 查询用户信息
        User user = userService.getById(userId);
        if (user == null) {
            return Result.error().message("用户不存在");
        }
        
        // 检查用户名是否已存在（如果修改了用户名）
        if (dto.getUsername() != null && !dto.getUsername().equals(user.getUsername())) {
            LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
            wrapper.eq(User::getUsername, dto.getUsername());
            if (userService.count(wrapper) > 0) {
                return Result.error().message("用户名已存在");
            }
            user.setUsername(dto.getUsername());
        }
        
        // 更新其他信息
        if (dto.getPhone() != null) {
            user.setPhone(dto.getPhone());
        }
        
        if (dto.getAvatar() != null) {
            user.setAvatar(dto.getAvatar());
        }
        
        user.setUpdateTime(System.currentTimeMillis());
        
        // 保存更新
        userService.updateById(user);
        
        // 返回更新后的用户信息
        UserVO userVO = UserConverter.convertToVO(user);
        return Result.ok().message("更新用户信息成功").data("user", userVO);
    }
    
    /**
     * 修改密码
     */
    @ApiOperation(value = "修改密码")
    @PutMapping("/password")
    public Result updatePassword(@Valid @RequestBody UpdatePasswordDTO dto) {
        // 获取当前用户ID
        Long userId = SecurityUtil.getCurrentUserId();
        // 查询用户信息
        User user = userService.getById(userId);
        if (user == null) {
            return Result.error().message("用户不存在");
        }
        
        // 验证旧密码
        if (!MD5Util.encrypt(dto.getOldPassword()).equals(user.getPassword())) {
            return Result.error().message("原密码错误");
        }
        
        // 更新密码
        LambdaUpdateWrapper<User> updateWrapper = new LambdaUpdateWrapper<>();
        updateWrapper.eq(User::getId, userId);
        updateWrapper.set(User::getPassword, MD5Util.encrypt(dto.getNewPassword()));
        updateWrapper.set(User::getUpdateTime, System.currentTimeMillis());
        
        boolean success = userService.update(updateWrapper);
        if (success) {
            // 更新成功后登出用户（清除令牌）
            userService.logout(userId);
            return Result.ok().message("密码修改成功，请重新登录");
        } else {
            return Result.error().message("密码修改失败");
        }
    }
}
